package sany.iec.utils;

/**
 * @Author : 托马斯
 * @Date : 2025/7/7 12:59
 * @Description : DataParseUtil
 */
public class DataParseUtil {

    /**
     * 如果是负数则进行截断
     *
     * @param s : 得到16进制的字符
     */
    public static String getShort16Char(Short s) {
        String str = String.format("%16s", Integer.toBinaryString(s)).replace(' ', '0');
        int length = str.length() - 16;
        return str.substring(length);
    }

    public static String getInt32Char(int s) {
        String str = String.format("%32s", Integer.toBinaryString(s)).replace(' ', '0');
        int length = str.length() - 32;
        return str.substring(length);
    }

    /**
     * 得到32位的二进制数据
     *
     * @param s : 浮点数，也可以是整数
     */
    public static String getFloat32Char(Float s) {
        // 将 float 转换为 IEEE 754 表示的 int
        int bits = Float.floatToIntBits(s);
        // 转换为 32 位二进制字符串（前面补 0）
        return String.format("%32s", Integer.toBinaryString(bits)).replace(' ', '0');
    }


    /**
     * 通过16位二进制得到Short(AB)
     */
    public static Short getShortAB(String s) {
        return (short) Integer.parseInt(s, 2);
    }

    /**
     * 通过16位二进制得到Short(BA)
     */
    public static Short getShortBA(String s) {
        String s1 = s.substring(8) + s.substring(0, 8);
        return (short) Integer.parseInt(s1, 2);
    }

    /**
     * 通过32位二进制得到Integer
     */
    private static int getInt(String s) {
        int flag = s.charAt(0) == '1' ? -1 : 1;
        s = '0' + s.substring(1);
        Integer intBits = Integer.parseInt(s, 2);
        return intBits * flag;
    }

    /**
     * 通过32位二进制得到Float
     */
    private static Float getFloat(String s) {
        int flag = s.charAt(0) == '1' ? -1 : 1;
        s = '0' + s.substring(1);
        Integer intBits = Integer.parseInt(s, 2);
        return Float.intBitsToFloat(intBits) * flag;
    }

    /**
     * 得到浮点数 IntBA
     */
    public static int getIntBA(Short num) {
        String AB = getShort16Char(num);
        return getShortBA(AB);
    }

    /**
     * 得到浮点数 floatABCD
     */
    public static int getIntABCD(Short num1, Short num2) {
        String AB = getShort16Char(num1);
        String CD = getShort16Char(num2);
        String str = AB + CD;
        return getInt(str);
    }

    /**
     * 得到浮点数 floatCDAB
     */
    public static int getIntCDAB(Short num1, Short num2) {
        String AB = getShort16Char(num1);
        String CD = getShort16Char(num2);
        String str = CD + AB;
        return getInt(str);
    }

    /**
     * 得到浮点数 floatABCD
     */
    public static Float getFloatABCD(Short num1, Short num2) {
        String AB = getShort16Char(num1);
        String CD = getShort16Char(num2);
        String str = AB + CD;
        return getFloat(str);
    }

    /**
     * 得到浮点数 floatCDAB
     */
    public static Float getFloatCDAB(Short num1, Short num2) {
        String AB = getShort16Char(num1);
        String CD = getShort16Char(num2);
        String str = CD + AB;
        return getFloat(str);
    }

    public static Short[] longABCDToShortArray(int num) {
        String s = getInt32Char(num);
        String s1 = s.substring(0, 16);
        String s2 = s.substring(16);
        return new Short[] { getShortAB(s1), getShortAB(s2)};
    }

    public static Short[] longCDABToShortArray(int num) {
        String s = getInt32Char(num);
        String s1 = s.substring(0, 16);
        String s2 = s.substring(16);
        return new Short[] { getShortAB(s2), getShortAB(s1)};
    }

    public static Short[] floatABCDToShortArray(float num) {
        String s = getFloat32Char(num);
        String s1 = s.substring(0, 16);
        String s2 = s.substring(16);
        return new Short[] { getShortAB(s1), getShortAB(s2)};
    }

    public static Short[] floatCDABToShortArray(float num) {
        String s = getFloat32Char(num);
        String s1 = s.substring(0, 16);
        String s2 = s.substring(16);
        return new Short[] { getShortAB(s2), getShortAB(s1)};
    }

}
